﻿// ===============================================================================
//  Copyright © ymind.net. All rights reserved .
//  官方网站：http://ymind.net/
//  版权所有：彦铭工作室 老陈出品
// ===============================================================================

using System;
using System.Text;

namespace Lcsoft.Data.Configuration
{
	/// <summary>
	/// 表示数据库连接配置信息。
	/// </summary>
	[Serializable]
	public sealed class DatabaseConnectionString : IEquatable<DatabaseConnectionString>, IComparable<DatabaseConnectionString>
	{
		/// <summary>
		/// 表示空的数据库连接配置信息。
		/// </summary>
		public static readonly DatabaseConnectionString Empty = new DatabaseConnectionString(String.Empty, String.Empty, String.Empty);

		/// <summary>
		/// 初始化 <see cref="DatabaseConnectionString"/> 对象。
		/// </summary>
		/// <param name="group">数据库连接的分组名称。</param>
		/// <param name="name">数据库连接的唯一名称。</param>
		/// <param name="value">数据库连接字符串。</param>
		public DatabaseConnectionString(string group, string name, string value)
		{
			if (group == null) throw new ArgumentNullException("group");
			if (name == null) throw new ArgumentNullException("name");
			if (value == null) throw new ArgumentNullException("value");

			this.Group = group;
			this.Name = name;
			this.Value = value;
		}

		/// <summary>
		/// 获取数据库连接的分组名称，同组的多个连接会自动轮询调度访问。
		/// </summary>
		public string Group { get; private set; }

		/// <summary>
		/// 获取数据库连接的唯一名称。
		/// </summary>
		public string Name { get; private set; }

		/// <summary>
		/// 获取数据库连接字符串。
		/// </summary>
		public string Value { get; private set; }

		#region IComparable<DatabaseConnectionString> Members

		/// <summary>
		/// 比较当前对象和同一类型的另一对象。
		/// </summary>
		/// <param name="other">与此对象进行比较的对象。</param>
		/// <returns>一个值，指示要比较的对象的相对顺序。</returns>
		public int CompareTo(DatabaseConnectionString other)
		{
			if (other == null) return 1;

			var compareValue = String.CompareOrdinal(this.Group, other.Group);

			return compareValue == 0 ? String.CompareOrdinal(this.Name, other.Name) : compareValue;
		}

		#endregion

		#region IEquatable<DatabaseConnectionString> Members

		/// <summary>
		/// 指示当前对象是否等于同一类型的另一个对象。
		/// </summary>
		/// <param name="other">与此对象进行比较的对象。</param>
		/// <returns>如果当前对象等于 <paramref name="other"/> 参数，则为 true；否则为 false。</returns>
		public bool Equals(DatabaseConnectionString other)
		{
			if (ReferenceEquals(null, other)) return false;
			if (ReferenceEquals(this, other)) return true;

			return string.Equals(this.Name, other.Name) && string.Equals(this.Group, other.Group);
		}

		#endregion

		/// <summary>
		/// 确定指定的 <see cref="DatabaseConnectionString"/> 是否等于当前的 <see cref="DatabaseConnectionString"/>。
		/// </summary>
		/// <param name="obj">要与当前对象进行比较的对象。</param>
		/// <returns>如果指定的 <see cref="DatabaseConnectionString"/> 等于当前的 <see cref="DatabaseConnectionString"/>，则为 true；否则为 false。</returns>
		public override bool Equals(object obj)
		{
			if (ReferenceEquals(null, obj)) return false;
			if (ReferenceEquals(this, obj)) return true;

			return obj is DatabaseConnectionString && this.Equals((DatabaseConnectionString)obj);
		}

		/// <summary>
		/// 返回表示当前对象的字符串。
		/// </summary>
		/// <returns>表示当前对象的字符串。</returns>
		public override string ToString()
		{
			var s = new StringBuilder();

			s.Append(@"Group = """);
			s.Append(this.Group);
			s.Append(@""", ");

			s.Append(@"Name = """);
			s.Append(this.Name);
			s.Append(@""", ");

			s.Append(@"Value = """);
			s.Append(this.Value);
			s.Append(@"""");

			return s.ToString();
		}

		/// <summary>
		/// 返回当前对象的哈希代码。
		/// </summary>
		/// <returns>当前 <see cref="DatabaseConnectionString"/> 的哈希代码。</returns>
		public override int GetHashCode()
		{
			unchecked
			{
				return ((this.Name != null ? this.Name.GetHashCode() : 0)*397) ^ (this.Group != null ? this.Group.GetHashCode() : 0);
			}
		}
	}
}
